package com.bill.common.news.service;

import com.bill.common.news.dao.ICategoryDAO;
import com.bill.common.news.dao.INewsDAO;
import com.bill.common.news.dto.CategoryDTO;
import com.bill.common.news.dto.NewsContentDTO;
import com.bill.common.news.dto.NewsDTO;
import com.bill.common.news.dto.NewsDetailDTO;
import com.bill.common.news.dto.NewsGridDTO;
import com.bill.common.news.dto.NewsQueryDTO;
import com.bill.common.news.dto.NewsWebDTO;
import com.bill.common.news.dto.ViewNewListDTO;
import com.bill.common.news.entity.Category;
import com.bill.common.news.entity.News;
import com.bill.common.news.entity.Topic;
import com.sinba.common.dto.PageDTO;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class NewsService
    implements INewsService
{
    @Autowired
    private INewsDAO newsDAO;
    @Autowired
    private ICategoryDAO categoryDAO;
    @Autowired
    private ICategoryService categoryService;

    //分页
    @Transactional
    public PageDTO findNewsPager( NewsQueryDTO qdto, String sord, String sidx )
    {
        PageDTO p = newsDAO.findNewsPager( qdto, sord, sidx );
        List<News> newsList = (List<News>) p.getData(  );
        List<NewsGridDTO> newsDTOList = new ArrayList<NewsGridDTO>(  );

        for ( News entity : newsList )
        {
            NewsGridDTO newsGridDTO = new NewsGridDTO(  );
            newsGridDTO.entity2dto( entity, newsGridDTO );
            newsGridDTO.setCreateTime( entity.getCreateTime(  ) );

            Category category = entity.getCategory(  );

            if ( category != null )
            {
                newsGridDTO.setCategoryName( category.getCategoryName(  ) );
            }

            newsGridDTO.setTop( entity.isTop(  ) );
            newsDTOList.add( newsGridDTO );
        }

        p.setData( newsDTOList );

        return p;
    }
    ;

    //查看新闻详细
    @Transactional
    public NewsDetailDTO findNewsById( Long id )
    {
        News news = newsDAO.findById( id );
        NewsDetailDTO newsInfo = new NewsDetailDTO(  );
        newsInfo.entity2dto( news, newsInfo );
        newsInfo.setReleaseTime( news.getCreateTime(  ) );

        Category category = news.getCategory(  );

        if ( category != null )
        {
            newsInfo.setCategoryId( category.getCategoryId(  ) );
            newsInfo.setCategoryName( category.getCategoryName(  ) );

            Topic topic = category.getTopic(  );

            if ( topic != null )
            {
                newsInfo.setTopicName( topic.getTopicName(  ) );
            }
        }

        return newsInfo;
    }
    ;

    //查看新闻详细
    @Transactional
    public NewsDetailDTO findNewsByNewType( String newType )
    {
        NewsQueryDTO qdto = new NewsQueryDTO(  );
        qdto.setNewType( newType );
        qdto.setStart( 0 );
        qdto.setLimit( 1 );

        PageDTO pageDTO = newsDAO.findNewsPager( qdto, null, null );
        List<News> news = (List<News>) pageDTO.getData(  );
        NewsDetailDTO newsInfo = new NewsDetailDTO(  );

        if ( ( news != null ) && ( news.size(  ) > 0 ) )
        {
            News entity = news.get( 0 );
            newsInfo.entity2dto( entity, newsInfo );
            newsInfo.setReleaseTime( entity.getCreateTime(  ) );
        } else
        {
            News entity = new News(  );
            entity.setNewType( newType );
            entity.setTitle( newType );
            newsDAO.save( entity );
            newsInfo.entity2dto( entity, newsInfo );
        }

        return newsInfo;
    }
    ;

    //查看新闻详细
    @Transactional
    public NewsDetailDTO findNewsBycode( NewsQueryDTO qdto, String sord, String sidx )
    {
        NewsDetailDTO newsInfo = new NewsDetailDTO(  );
        PageDTO p = newsDAO.findNewsPager( qdto, sord, sidx );

        if ( ( null != p ) && ( p.getData(  ) != null ) )
        {
            News news = (News) p.getData(  ).get( 0 );
            newsInfo.entity2dto( news, newsInfo );
            newsInfo.setReleaseTime( news.getCreateTime(  ) );

            Category category = news.getCategory(  );

            if ( category != null )
            {
                newsInfo.setCategoryId( category.getCategoryId(  ) );
                newsInfo.setCategoryName( category.getCategoryName(  ) );

                Topic topic = category.getTopic(  );

                if ( topic != null )
                {
                    newsInfo.setTopicName( topic.getTopicName(  ) );
                }
            }
        }

        return newsInfo;
    }
    ;

    //保存新闻
    @Transactional
    public void saveNews( NewsDTO dto )
    {
        News news = new News(  );
        dto.dto2entity( dto, news );

        if ( ( dto.getCategoryId(  ) != null ) && ( dto.getCategoryId(  ) > 0 ) )
        {
            news.setCategory( categoryDAO.findById( dto.getCategoryId(  ) ) );
        }

        news.setTop( dto.isTop(  ) );
        news.setLastUpdateTime( new Date(  ) );
        newsDAO.save( news );
    }
    ;

    //编辑新闻
    @Transactional
    public void editNews( NewsDTO dto )
    {
        News news = newsDAO.findById( dto.getNewId(  ) );
        news.setTitle( dto.getTitle(  ) );
        news.setContent( dto.getContent(  ) );
        news.setKeyword( dto.getKeyword(  ) );

        if ( ( dto.getCategoryId(  ) != null ) && ( dto.getCategoryId(  ) > 0 ) )
        {
            news.setCategory( categoryDAO.findById( dto.getCategoryId(  ) ) );
        }

        news.setTop( dto.isTop(  ) );
        news.setLastUpdateTime( new Date(  ) );
        newsDAO.merge( news );
    }
    ;

    //删除新闻
    @Transactional
    public void delteNews( Long[] ids )
    {
        newsDAO.deleteByIds( ids );
    }
    ;

    //根据当前分类查询新闻列表及同�?��目的分类
    @Transactional
    public ViewNewListDTO findNewsAndCategorysByCategoryId( NewsQueryDTO qdto, String sord, String sidx )
    {
        //获取栏目下的第一个分�?
        PageDTO pageDTO = new PageDTO(  );

        if ( ( qdto != null ) && ( qdto.getTopicId(  ) != null ) )
        {
            CategoryDTO categoryDTO = new CategoryDTO(  );
            categoryDTO.setTopicId( qdto.getTopicId(  ) );

            PageDTO p = categoryService.findCategoryPager( categoryDTO, "desc", "categoryOrder" );

            if ( ( p.getData(  ) != null ) && ( p.getData(  ).size(  ) > 0 ) )
            {
                CategoryDTO dto = (CategoryDTO) p.getData(  ).get( 0 );

                qdto.setCategoryId( dto.getCategoryId(  ) );
            } else
            {
                qdto.setCategoryId( 1L );
            }
        }

        ViewNewListDTO vnlDTO = new ViewNewListDTO(  );
        //查询当前分类下的新闻
        pageDTO = newsDAO.findNewsPager( qdto, "desc", "createTime" );

        if ( ( qdto != null ) &&
                 ( qdto.getTopicId(  ) != null ) &&
                 ( ( pageDTO == null ) || ( pageDTO.getTotalSize(  ) == 0 ) ) )
        { //如果第一分类没有则查询全�?
            pageDTO =
                newsDAO.findNewsPager( new NewsQueryDTO(  ),
                                       "desc",
                                       "createTime" );
        }

        List<News> news = (List<News>) pageDTO.getData(  );
        List<NewsWebDTO> newsWebsDTO = new ArrayList<NewsWebDTO>(  );

        for ( News entity : news )
        {
            NewsWebDTO webDTO = new NewsWebDTO(  );
            webDTO.setNewId( entity.getNewId(  ) );
            webDTO.setTitle( entity.getTitle(  ) );
            webDTO.setReleaseTime( entity.getCreateTime(  ) );
            newsWebsDTO.add( webDTO );
        }

        pageDTO.setData( newsWebsDTO );
        vnlDTO.setPageDTO( pageDTO );

        //查询当前分类
        Category category = categoryDAO.findById( qdto.getCategoryId(  ) );

        if ( category != null )
        {
            vnlDTO.setCategoryName( category.getCategoryName(  ) );

            Topic topic = category.getTopic(  );

            if ( topic != null )
            {
                //设置栏目名称
                vnlDTO.setTopicName( category.getTopic(  ).getTopicName(  ) );

                CategoryDTO cqdto = new CategoryDTO(  );
                cqdto.setTopicId( topic.getTopicId(  ) );

                List<Category> categorys = categoryDAO.findCategoryPager( cqdto, sord, sidx ).getData(  );
                List<CategoryDTO> categorysDTO = new ArrayList<CategoryDTO>(  );

                for ( Category category1 : categorys )
                {
                    CategoryDTO categoryDTO = new CategoryDTO(  );
                    categoryDTO.entity2dto( category1, categoryDTO );
                    categorysDTO.add( categoryDTO );
                }

                vnlDTO.setCategorysDTO( categorysDTO );
            }
        }

        return vnlDTO;
    }

    /**
     * 按时间排序查�?
             * @param qdto
     * @return
     */
    @Transactional
    public PageDTO findNewsByCategory( NewsQueryDTO qdto )
    {
        PageDTO pageDTO = newsDAO.findNewsPager( qdto, "desc", "createTime" );

        return pageDTO;
    }

    /**
     * 查询分类的第�?��
     * @param qdto
     * @return
     */
    @Transactional
    public NewsContentDTO findTop1NewsByCategory( NewsQueryDTO qdto )
    {
        qdto.setLimit( 1 );

        PageDTO pageDTO = newsDAO.findNewsPager( qdto, "desc", "createTime" );
        NewsContentDTO dto = new NewsContentDTO(  );

        if ( ( pageDTO != null ) && ( pageDTO.getData(  ) != null ) && ( pageDTO.getData(  ).size(  ) > 0 ) )
        {
            News news = (News) pageDTO.getData(  ).get( 0 );

            if ( news != null )
            {
                dto.setContent( news.getContent(  ) );
                dto.setReleaseTime( news.getCreateTime(  ) );
                dto.setLastUpdateTime( news.getLastUpdateTime(  ) );
            }
        }

        return dto;
    }
}
